package org.apli.haiam.admin.jsf.managed;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.CexDiagnostico;
import org.apli.haiam.ejb.entidades.CexHistoriaClinica;
import org.apli.haiam.ejb.entidades.EmeDiagnosticoIngresoAlta;
import org.apli.haiam.ejb.entidades.HosReferenciaContrareferencia;
import org.apli.haiam.ejb.entidades.HosRegistroDetalle;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad HosRegistroEncabezado.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfIngreso extends JsfBean<HosRegistroDetalle> {

    final Logger log = LoggerFactory.getLogger(JsfIngreso.class);
    private HosReferenciaContrareferencia hosReferencia;
    private int tipoBusqueda;
    private String parametroBusqueda;
    private String primerNombreBusqueda;
    private String segundoNombreBusqueda;
    private String apellidoPaternoBusqueda;
    private String apellidoMaternoBusqueda;
    private List<CexHistoriaClinica> listaHClinica;
    private EmeDiagnosticoIngresoAlta emeDiagnosticoIngreso;
    private int tipoBusquedaDiagnostico;
    private String busquedaDiagnostico;
    private List<CexDiagnostico> listadiagnosticoPopup;
    private UsuarioAdmin usuario;

    /**
     * Constructor por defecto.
     */
    public JsfIngreso() {
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        object = new HosRegistroDetalle();
        hosReferencia = new HosReferenciaContrareferencia();
        tipoBusqueda = 1;
        parametroBusqueda = "";
        primerNombreBusqueda = "";
        segundoNombreBusqueda = "";
        apellidoPaternoBusqueda = "";
        apellidoMaternoBusqueda = "";
        listaHClinica = new ArrayList<>();
        emeDiagnosticoIngreso = new EmeDiagnosticoIngresoAlta();
        tipoBusquedaDiagnostico = 1;
        busquedaDiagnostico = "";
        listadiagnosticoPopup = new ArrayList<>();
        usuario = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();

        if (object.getHrdId() == null) {
            try {
                if (hosReferencia.getCexHistoriaClinica() != null) {
                    if (emeDiagnosticoIngreso.getCexDiagnostico() != null) {
                        hosReferencia.setHrcIdUsuarioReferencia(usuario.getUser().getIdUsuario().intValue());
                        hosReferencia.setHrcNombreUsuarioReferencia(usuario.getUser().getAdmEmpleado().getNombreFull());
                        adminObject.crear(hosReferencia, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        object.setHrdEstado(1);
                        object.setHrdIdUsuario(usuario.getUser().getIdUsuario().intValue());
                        object.setHrdNombreUsuario(usuario.getUser().getAdmEmpleado().getNombreFull());
                        object.setHosReferenciaContrareferencia(hosReferencia);
                        admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        emeDiagnosticoIngreso.setHosReferenciaContrareferencia(hosReferencia);
                        adminObject.crear(emeDiagnosticoIngreso, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        inicializar();
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Diagnostico requerido", "Debe agregar un diagnostico para poder grabar el ingreso"));
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Paciente requerido", "Debe agregar un paciente para poder grabar el ingreso"));
                }
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        } else {
            try {
                admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        }
        cargarLista();

        return null;
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            lista = admin.listarOrdenada(object.getClass(), "hrdEstado", 1, "hrdFecha", false);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }
    
    /**
     * Implementa el comportamiento para inicializar los datos del objeto a
     * administrar.
     *
     * @return null, retorna a la página invocada.
     */
    @Override
    public String nuevoAction() {
        inicializar();
        return null;
    }

    @Override
    public String editarAction(HosRegistroDetalle obj) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            object = null;
            hosReferencia = null;
            emeDiagnosticoIngreso = null;
            object = obj;
            hosReferencia = object.getHosReferenciaContrareferencia();
            emeDiagnosticoIngreso = hosReferencia.getEmeDiagnosticoIngresoAltaList().get(0);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
        try {
//////            List<HosRegistroEncabezado> datosS = admin.listarOrdenada(object.getClass(), "cpuNombre", true);
//////            // datos = admin.listarNullOrdenada(object.getClass(), "cexEspecialidad","espEstado",1, "espNombre", true);
//////            List<SelectItem> items = new ArrayList<>();
//////            for (HosRegistroEncabezado obj : datosS) {
//////                items.add(new SelectItem(obj, obj.getCpuNombre()));
//////            }
//////            return items;
        } catch (Exception e) {
            log.error("getSelectedItem() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Metodo que carga una historia clinica
     *
     *
     * @author David Carranza
     * @param item
     */
    public void cargarPaciente(CexHistoriaClinica item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            hosReferencia.setCexHistoriaClinica(item);
            listaHClinica.clear();
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Metodo que busca una historia clinica
     *
     *
     * @author David Carranza
     */
    public void buscarHc() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            hosReferencia.setCexHistoriaClinica(new CexHistoriaClinica());
            parametroBusqueda = parametroBusqueda.trim();
            if (parametroBusqueda.equals("") && tipoBusqueda != 3) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "valorBusqueda").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Valor nullo no permitido", "Ingrese parametro de busqueda"));
                return;
            } else if (apellidoPaternoBusqueda.equals("") && tipoBusqueda == 3) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "valorBusqueda").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Valor nullo no permitido", "Ingrese Apellido paterno para realizar la busqueda"));
                return;

            }
            if (tipoBusqueda == 1) {
                if (admin.existePorCampo(CexHistoriaClinica.class, "chcCedula", parametroBusqueda, "chcEstado", 1)) {
                    hosReferencia.setCexHistoriaClinica(
                            (CexHistoriaClinica) adminObject.buscar(CexHistoriaClinica.class, "chcCedula", parametroBusqueda, "chcEstado", 1));
                    parametroBusqueda = "";

                    return;
                } else {
                    hosReferencia.setCexHistoriaClinica(new CexHistoriaClinica());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "valorBusqueda").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                    return;
                }
            }

            if (tipoBusqueda == 2) {
                if (admin.existePorCampo(CexHistoriaClinica.class, "chcHistoriaClinica", parametroBusqueda, "chcEstado", 1)) {
                    hosReferencia.setCexHistoriaClinica(
                            (CexHistoriaClinica) adminObject.buscar(CexHistoriaClinica.class, "chcHistoriaClinica", parametroBusqueda, "chcEstado", 1));
                    parametroBusqueda = "";

                    return;
                } else {
                    hosReferencia.setCexHistoriaClinica(new CexHistoriaClinica());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "valorBusqueda").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                    return;
                }
            }

            if (tipoBusqueda == 3) {
                listaHClinica.clear();
                apellidoPaternoBusqueda = apellidoPaternoBusqueda.toUpperCase().trim();
                apellidoMaternoBusqueda = apellidoMaternoBusqueda.toUpperCase().trim();
                primerNombreBusqueda = primerNombreBusqueda.toUpperCase().trim();
                segundoNombreBusqueda = segundoNombreBusqueda.toUpperCase().trim();
                listaHClinica = (List<CexHistoriaClinica>) admin.queryEJB("select a from CexHistoriaClinica a where a.chcApellidoPaterno like :var1 and a.chcApellidoMaterno like :var2 and a.chcPrimerNombre like :var3 and a.chcSegundoNombre like :var4 and a.chcEstado = 1", "%" + apellidoPaternoBusqueda + "%", "%" + apellidoMaternoBusqueda + "%", "%" + primerNombreBusqueda + "%", "%" + segundoNombreBusqueda + "%");
                //listaHClinica = admin.ejecutarQueryNativoLista("SELECT * from cex_historia_clinica WHERE hc_apellido_paterno LIKE '%" + apellidoPbusqueda + "%' and hc_apellido_materno like '%" + apellidoMbusqueda + "%' and hc_primer_nombre like '%" + pnombrebusqueda + "%' and hc_segundo_nombre like '%" + snombrePbusqueda + "%' and hc_estado = 1 ; ", CexHistoriaClinica.class);
                if (listaHClinica.isEmpty() || listaHClinica.size() <= 0) {
                    listaHClinica.clear();

                }
            }

            if (tipoBusqueda == 4) {
                if (admin.existePorCampo(CexHistoriaClinica.class, "chcPasaporte", parametroBusqueda, "chcEstado", 1)) {
                    hosReferencia.setCexHistoriaClinica(
                            (CexHistoriaClinica) adminObject.buscar(CexHistoriaClinica.class, "chcPasaporte", parametroBusqueda, "chcEstado", 1));
                    parametroBusqueda = "";
                } else {
                    hosReferencia.setCexHistoriaClinica(new CexHistoriaClinica());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "valorBusqueda").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Busqueda sin resultados", "No se encontro paciente"));
                }
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Carga la lista de objetos de tipo patologia en una lista de la página.
     */
    public void buscarDiagnostico() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        if (admin == null) {
            listadiagnosticoPopup = null;
            return;
        }
        try {
            busquedaDiagnostico = busquedaDiagnostico.toUpperCase();

            if (!busquedaDiagnostico.isEmpty() || busquedaDiagnostico != null) {
                if (tipoBusquedaDiagnostico == 1) {
                    listadiagnosticoPopup = adminObject.listarContiene(CexDiagnostico.class, "cdiCodigo", busquedaDiagnostico);
                } else {
                    listadiagnosticoPopup = adminObject.listarContiene(CexDiagnostico.class, "cdiNombre", busquedaDiagnostico);
                }
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "parDiag").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ingres valor para realizar la busqueda", "Ingres valor para realizar la busqueda"));

            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Agrega el item seleccinado de la tabla de busqueda de diagnostico al
     * objeto actual.
     *
     * @param item
     */
    public void agregarDiagnostico(CexDiagnostico item) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            if (item.getCdiSexo().equals(0) || item.getCdiSexo().equals(hosReferencia.getCexHistoriaClinica().getChcGenero())) {
                emeDiagnosticoIngreso.setCexDiagnostico(item);
            } else {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se puede agregar diagnostico", "Codigo incompatible con genero de paciente"));
            }
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    @Override
    public DataModel<HosRegistroDetalle> getDataModel() {
        return null;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    public HosReferenciaContrareferencia getHosReferencia() {
        return hosReferencia;
    }

    public void setHosReferencia(HosReferenciaContrareferencia hosReferencia) {
        this.hosReferencia = hosReferencia;
    }

    public int getTipoBusqueda() {
        return tipoBusqueda;
    }

    public void setTipoBusqueda(int tipoBusqueda) {
        this.tipoBusqueda = tipoBusqueda;
    }

    public String getParametroBusqueda() {
        return parametroBusqueda;
    }

    public void setParametroBusqueda(String parametroBusqueda) {
        this.parametroBusqueda = parametroBusqueda;
    }

    public String getPrimerNombreBusqueda() {
        return primerNombreBusqueda;
    }

    public void setPrimerNombreBusqueda(String primerNombreBusqueda) {
        this.primerNombreBusqueda = primerNombreBusqueda;
    }

    public String getSegundoNombreBusqueda() {
        return segundoNombreBusqueda;
    }

    public void setSegundoNombreBusqueda(String segundoNombreBusqueda) {
        this.segundoNombreBusqueda = segundoNombreBusqueda;
    }

    public String getApellidoPaternoBusqueda() {
        return apellidoPaternoBusqueda;
    }

    public void setApellidoPaternoBusqueda(String apellidoPaternoBusqueda) {
        this.apellidoPaternoBusqueda = apellidoPaternoBusqueda;
    }

    public String getApellidoMaternoBusqueda() {
        return apellidoMaternoBusqueda;
    }

    public void setApellidoMaternoBusqueda(String apellidoMaternoBusqueda) {
        this.apellidoMaternoBusqueda = apellidoMaternoBusqueda;
    }

    public List<CexHistoriaClinica> getListaHClinica() {
        return listaHClinica;
    }

    public void setListaHClinica(List<CexHistoriaClinica> listaHClinica) {
        this.listaHClinica = listaHClinica;
    }

    public EmeDiagnosticoIngresoAlta getEmeDiagnosticoIngreso() {
        return emeDiagnosticoIngreso;
    }

    public void setEmeDiagnosticoIngreso(EmeDiagnosticoIngresoAlta emeDiagnosticoIngreso) {
        this.emeDiagnosticoIngreso = emeDiagnosticoIngreso;
    }

    public int getTipoBusquedaDiagnostico() {
        return tipoBusquedaDiagnostico;
    }

    public void setTipoBusquedaDiagnostico(int tipoBusquedaDiagnostico) {
        this.tipoBusquedaDiagnostico = tipoBusquedaDiagnostico;
    }

    public String getBusquedaDiagnostico() {
        return busquedaDiagnostico;
    }

    public void setBusquedaDiagnostico(String busquedaDiagnostico) {
        this.busquedaDiagnostico = busquedaDiagnostico;
    }

    public List<CexDiagnostico> getListadiagnosticoPopup() {
        return listadiagnosticoPopup;
    }

    public void setListadiagnosticoPopup(List<CexDiagnostico> listadiagnosticoPopup) {
        this.listadiagnosticoPopup = listadiagnosticoPopup;
    }

}
